package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"strconv"
)

/*
学生信息系统添加 无限次添加和查询，按q退出
1、添加学生信息
	判断此用户名有没有添加过
	没有这个用户就提示输出学生信息（姓名、年龄、性别、住址）

2、查询学生信息
	按名字查询

*/

/*
json：轻量级的数据交换格式

	字符串
*/
var input string
var name string
var age string
var sex string
var address string
var stuInfo = map[string]map[string]string{}

func main() {
	file, e := os.OpenFile("2024-06-23-go指针/student.txt", os.O_RDONLY, 777)
	if e != nil {
		fmt.Println("文件打开失败", e)
		return
	}

	reader := bufio.NewReader(file)
	for {
		line, _, e := reader.ReadLine()
		if e == io.EOF {
			break
		}

		json.Unmarshal([]byte(line), &stuInfo)
	}

	fmt.Println(stuInfo)

	for {
		fmt.Println("请输入你的选择，按1进行添加学生信息，按2进行查询学生信息，按q退出程序")
		fmt.Scanln(&input)
		if input == "q" {
			fmt.Println("程序退出成功")
			break
		} else if input == "1" {
			fmt.Println("下面进行学生信息添加，请输入你想添加的学生姓名：")
			fmt.Scanln(&name)
			if _, ok := stuInfo[name]; ok {
				fmt.Println("此学生已添加！")
				continue
			} else {
				ages := -1
				fmt.Printf("请分别输入%s同学的年龄、性别、住址:\n", name)
				for ages < 0 {
					fmt.Println("请输入年龄：")
					fmt.Scanln(&age)
					ages, _ = strconv.Atoi(age)
				}
				for sex != "男" && sex != "女" {
					fmt.Println("请输入性别：")
					fmt.Scanln(&sex)
				}
				fmt.Println("请输入住址：")
				fmt.Scanln(&address)
				Addstu(name, age, sex, address)
			}
		} else if input == "2" {
			fmt.Println("请输入你要查询的学生姓名：")
			fmt.Scanln(&name)
			Selectstu(name)

		} else {
			fmt.Print("输入不合法，请重新输入\n")
		}
	}
	file.Close()

}

func Addstu(name string, age string, sex string, address string) {
	file, e := os.OpenFile("2024-06-23-go指针/student.txt", os.O_APPEND, 777)
	if e != nil {
		fmt.Println("文件打开失败", e)
		return
	}
	data := map[string]interface{}{
		name: map[string]string{
			"age":     age,
			"sex":     sex,
			"address": address,
		},
	}

	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("转换为 JSON 失败：", err)
		return
	}

	file.WriteString("\n")
	_, err = file.WriteString(string(jsonData))
	if err != nil {
		fmt.Println("写入文件失败：", err)
		return
	}

	fmt.Println("写入成功！")
	file.Close()
	return
}

func Selectstu(name string) {
	value, ok := stuInfo[name]
	if ok {
		fmt.Println("该学生信息为：", value)
	} else {
		fmt.Println("该学生信息不存在")
	}
}
